<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<meta name="generator" content="ApiGen 2.6.0" />
	<meta name="robots" content="noindex" />

	<title>File __inject.php</title>

	<script type="text/javascript" src="resources/combined.js?428767200"></script>
	<script type="text/javascript" src="elementlist.js?4200546020"></script>
	<link rel="stylesheet" type="text/css" media="all" href="resources/style.css?2495970611" />

</head>

<body>
<div id="left">
	<div id="menu">
		<a href="index.html" title="Overview"><span>Overview</span></a>


		<div id="groups">
			<h3>Namespaces</h3>
			<ul>
				<li class="active"><a href="namespace-None.html">None</a>
						</li>
				<li><a href="namespace-PHP.html">PHP</a>
						</li>
			</ul>
		</div>

		<hr />


		<div id="elements">
			<h3>Classes</h3>
			<ul>
				<li><a href="class-DIBase.html">DIBase</a></li>
				<li><a href="class-DIConfig.html">DIConfig</a></li>
				<li><a href="class-DIContext.html">DIContext</a></li>
				<li><a href="class-DIContext_Inject.html">DIContext_Inject</a></li>
				<li><a href="class-DIDBConfig.html" class="invalid">DIDBConfig</a></li>
				<li><a href="class-DIDo.html">DIDo</a></li>
				<li><a href="class-DIEntity.html">DIEntity</a></li>
				<li><a href="class-DIError.html">DIError</a></li>
				<li><a href="class-DIErrorCode.html">DIErrorCode</a></li>
				<li><a href="class-DIEvent.html">DIEvent</a></li>
				<li><a href="class-DIFilterMap.html">DIFilterMap</a></li>
				<li><a href="class-DIFilterUtil.html">DIFilterUtil</a></li>
				<li><a href="class-DIInclude.html">DIInclude</a></li>
				<li><a href="class-DIIncludeConfig.html">DIIncludeConfig</a></li>
				<li><a href="class-DIInject.html">DIInject</a></li>
				<li><a href="class-DILet.html">DILet</a></li>
				<li><a href="class-DIModel.html">DIModel</a></li>
				<li><a href="class-DIModelUtil.html">DIModelUtil</a></li>
				<li><a href="class-DIMySQL.html">DIMySQL</a></li>
				<li><a href="class-DIRoute.html">DIRoute</a></li>
				<li><a href="class-DIRuntime.html">DIRuntime</a></li>
				<li><a href="class-DIRuntime_Imported.html">DIRuntime_Imported</a></li>
				<li><a href="class-DIService.html">DIService</a></li>
				<li><a href="class-DITpl.html">DITpl</a></li>
				<li><a href="class-DIUrlShell.html">DIUrlShell</a></li>
				<li><a href="class-Global1Filter.html">Global1Filter</a></li>
				<li><a href="class-Global2Filter.html">Global2Filter</a></li>
				<li><a href="class-Global3Filter.html">Global3Filter</a></li>
				<li><a href="class-OrekiUtil.html">OrekiUtil</a></li>
				<li><a href="class-TemplateDo.html">TemplateDo</a></li>
				<li><a href="class-Test.html">Test</a></li>
				<li><a href="class-TestDo.html">TestDo</a></li>
				<li><a href="class-TestInject.html">TestInject</a></li>
				<li><a href="class-TesttestDo.html">TesttestDo</a></li>
				<li><a href="class-XxxFilter.html">XxxFilter</a></li>
				<li><a href="class-YyyFilter.html">YyyFilter</a></li>
			</ul>

			<h3>Interfaces</h3>
			<ul>
				<li><a href="class-DIEvent_AppendFuncListener.html">DIEvent_AppendFuncListener</a></li>
				<li><a href="class-DIEvent_AppendVariableListener.html">DIEvent_AppendVariableListener</a></li>
				<li><a href="class-DIEvent_CallFuncListener.html">DIEvent_CallFuncListener</a></li>
				<li><a href="class-DIEvent_CallStaticFuncListener.html">DIEvent_CallStaticFuncListener</a></li>
				<li><a href="class-DIEvent_ClassCallListener.html">DIEvent_ClassCallListener</a></li>
				<li><a href="class-DIEvent_DestroyListener.html">DIEvent_DestroyListener</a></li>
				<li><a href="class-DIEvent_GetStaticVariableListener.html">DIEvent_GetStaticVariableListener</a></li>
				<li><a href="class-DIEvent_GetVariableListener.html">DIEvent_GetVariableListener</a></li>
				<li><a href="class-DIEvent_ObjCallListener.html">DIEvent_ObjCallListener</a></li>
				<li><a href="class-DIEvent_ObjCreateListener.html">DIEvent_ObjCreateListener</a></li>
				<li><a href="class-DIEvent_SetStaticVariableListener.html">DIEvent_SetStaticVariableListener</a></li>
				<li><a href="class-DIEvent_SetVariableListener.html">DIEvent_SetVariableListener</a></li>
				<li><a href="class-DIEventListener.html">DIEventListener</a></li>
				<li><a href="class-DIFilter.html">DIFilter</a></li>
				<li><a href="class-DIModelTemplate.html">DIModelTemplate</a></li>
			</ul>


			<h3>Exceptions</h3>
			<ul>
				<li><a href="class-DIException.html">DIException</a></li>
			</ul>


			<h3>Functions</h3>
			<ul>
				<li><a href="function-__autoload.html">__autoload</a></li>
				<li><a href="function-arg.html">arg</a></li>
				<li><a href="function-array_unset.html">array_unset</a></li>
				<li><a href="function-bt_page.html">bt_page</a></li>
				<li><a href="function-bt_shell_page.html">bt_shell_page</a></li>
				<li><a href="function-component_exist.html">component_exist</a></li>
				<li><a href="function-create_class.html">create_class</a></li>
				<li><a href="function-dump.html">dump</a></li>
				<li><a href="function-getip.html">getip</a></li>
				<li><a href="function-import.html">import</a></li>
				<li class="active"><a href="function-inject.html">inject</a></li>
				<li><a href="function-inject_dymic.html">inject_dymic</a></li>
				<li><a href="function-inject_full.html">inject_full</a></li>
				<li><a href="function-inject_func.html">inject_func</a></li>
				<li><a href="function-injectObjFunc.html">injectObjFunc</a></li>
				<li><a href="function-invoke_func.html">invoke_func</a></li>
				<li><a href="function-invoke_method.html">invoke_method</a></li>
				<li><a href="function-let.html">let</a></li>
				<li><a href="function-let_exists.html">let_exists</a></li>
				<li><a href="function-params_to_str.html">params_to_str</a></li>
				<li><a href="function-putjson.html">putjson</a></li>
				<li><a href="function-putjsonp.html">putjsonp</a></li>
				<li><a href="function-redirect.html">redirect</a></li>
				<li><a href="function-ref_arr.html">ref_arr</a></li>
				<li><a href="function-session.html">session</a></li>
				<li><a href="function-session_exists.html">session_exists</a></li>
				<li><a href="function-session_remove.html">session_remove</a></li>
				<li><a href="function-url.html">url</a></li>
			</ul>
		</div>
	</div>
</div>

<div id="splitter"></div>

<div id="right">
<div id="rightInner">
	<form id="search">
		<input type="hidden" name="cx" value="" />
		<input type="hidden" name="ie" value="UTF-8" />
		<input type="text" name="q" class="text" />
		<input type="submit" value="Search" />
	</form>

	<div id="navigation">
		<ul>
			<li>
				<a href="index.html" title="Overview"><span>Overview</span></a>
			</li>
			<li>
				<a href="namespace-None.html" title="Summary of None"><span>Namespace</span></a>
			</li>
			<li>
				<a href="function-inject.html" title="Summary of inject"><span>Function</span></a>
			</li>
		</ul>
		<ul>
			<li>
				<a href="tree.html" title="Tree view of classes, interfaces, traits and exceptions"><span>Tree</span></a>
			</li>
		</ul>
		<ul>
		</ul>
	</div>

<pre><code><a href="#1" id="1" class="l">  1: </a><span class="xlang">&lt;?php</span>
<a href="#2" id="2" class="l">  2: </a>
<a href="#3" id="3" class="l">  3: </a><span class="php-comment">/* 注入增强，仅供DIDo使用 */</span>
<a href="#4" id="4" class="l">  4: </a>
<a href="#5" id="5" class="l">  5: </a><span class="php-keyword1">abstract</span> <span class="php-keyword1">class</span> DIInject <span class="php-keyword1">extends</span> DIBase {
<a href="#6" id="6" class="l">  6: </a>    
<a href="#7" id="7" class="l">  7: </a>    <span class="php-comment">/** @var DIDo 持有引用它本身的控制器XxxDo，可以作为监视XxxDo的依据 */</span>
<a href="#8" id="8" class="l">  8: </a>    <span class="php-keyword1">protected</span> <span class="php-var">$_do</span>;
<a href="#9" id="9" class="l">  9: </a>    
<a href="#10" id="10" class="l"> 10: </a>    <span class="php-keyword1">final</span> <span class="php-keyword1">function</span> __construct(DIDo <span class="php-var">$_do</span>){
<a href="#11" id="11" class="l"> 11: </a>        <span class="php-var">$this</span>-&gt;_do = <span class="php-var">$_do</span>;
<a href="#12" id="12" class="l"> 12: </a>    }
<a href="#13" id="13" class="l"> 13: </a>    
<a href="#14" id="14" class="l"> 14: </a>}
<a href="#15" id="15" class="l"> 15: </a>
<a href="#16" id="16" class="l"> 16: </a>
<a href="#17" id="17" class="l"> 17: </a>
<a href="#18" id="18" class="l"> 18: </a>
<a href="#19" id="19" class="l"> 19: </a><span class="php-comment">/**
</span><a href="#20" id="20" class="l"> 20: </a><span class="php-comment"> * 向对象实例方法注入前置或后置代码
</span><a href="#21" id="21" class="l"> 21: </a><span class="php-comment"> * @param object $obj 对象句柄
</span><a href="#22" id="22" class="l"> 22: </a><span class="php-comment"> * @param callable $callback 回调函数
</span><a href="#23" id="23" class="l"> 23: </a><span class="php-comment"> * @param array $callback_args 回调函数的参数
</span><a href="#24" id="24" class="l"> 24: </a><span class="php-comment"> * @param string $memberFuncName 要注册的非static方法名
</span><a href="#25" id="25" class="l"> 25: </a><span class="php-comment"> * @return int 状态码 (
</span><a href="#26" id="26" class="l"> 26: </a><span class="php-comment"> *      -1  -&gt; 不是对象句柄
</span><a href="#27" id="27" class="l"> 27: </a><span class="php-comment"> *      -2  -&gt; 不是回调函数
</span><a href="#28" id="28" class="l"> 28: </a><span class="php-comment"> *      -3  -&gt; 要注册的方法不存在
</span><a href="#29" id="29" class="l"> 29: </a><span class="php-comment"> *      -4  -&gt; 回调函数的参数表非数组形式
</span><a href="#30" id="30" class="l"> 30: </a><span class="php-comment"> * )
</span><a href="#31" id="31" class="l"> 31: </a><span class="php-comment"> * 处于测试阶段，$obj-&gt;__call()处代码有问题
</span><a href="#32" id="32" class="l"> 32: </a><span class="php-comment"> * 已被inject()和inject_full()取代，即将废除
</span><a href="#33" id="33" class="l"> 33: </a><span class="php-comment"> */</span>
<a href="#34" id="34" class="l"> 34: </a><span class="php-keyword1">function</span> injectObjFunc(<span class="php-var">$obj</span>, <span class="php-var">$callback</span>, <span class="php-var">$memberFuncName</span>=<span class="php-keyword1">null</span>, <span class="php-var">$callback_args</span>=<span class="php-keyword1">array</span>()){
<a href="#35" id="35" class="l"> 35: </a>
<a href="#36" id="36" class="l"> 36: </a>    <span class="php-keyword1">if</span>( !<span class="php-keyword2">is_object</span>(<span class="php-var">$obj</span>) ) <span class="php-keyword1">return</span> -<span class="php-num">1</span>;
<a href="#37" id="37" class="l"> 37: </a>    <span class="php-keyword1">if</span>( !<span class="php-keyword2">is_callable</span>(<span class="php-var">$callback</span>) ) <span class="php-keyword1">return</span> -<span class="php-num">2</span>;
<a href="#38" id="38" class="l"> 38: </a>    <span class="php-keyword1">if</span>( !<span class="php-var">$memberFuncName</span> &amp;&amp; !<span class="php-keyword2">method_exists</span>(<span class="php-var">$obj</span>, <span class="php-var">$memberFuncName</span>) ) <span class="php-keyword1">return</span> -<span class="php-num">3</span>;
<a href="#39" id="39" class="l"> 39: </a>    <span class="php-keyword1">if</span>( !<span class="php-keyword2">is_array</span>(<span class="php-var">$callback_args</span>) ) <span class="php-keyword1">return</span> -<span class="php-num">4</span>;
<a href="#40" id="40" class="l"> 40: </a>
<a href="#41" id="41" class="l"> 41: </a>    <span class="php-keyword1">try</span>{
<a href="#42" id="42" class="l"> 42: </a>        <span class="php-var">$obj</span>-&gt;__call = <span class="php-keyword1">function</span>(<span class="php-var">$name</span>, <span class="php-var">$args</span>) <span class="php-keyword1">use</span> (<span class="php-var">$obj</span>, <span class="php-var">$callback</span>, <span class="php-var">$memberFuncName</span>, <span class="php-var">$callback_args</span>){
<a href="#43" id="43" class="l"> 43: </a>                
<a href="#44" id="44" class="l"> 44: </a>            <span class="php-var">$bind</span> = <span class="php-keyword1">false</span>;
<a href="#45" id="45" class="l"> 45: </a>            <span class="php-keyword1">if</span>(! <span class="php-var">$memberFuncName</span>){
<a href="#46" id="46" class="l"> 46: </a>                <span class="php-var">$bind</span> = <span class="php-keyword1">true</span>;   <span class="php-comment">//不指定方法名，则视为所有方法都绑定回调函数</span>
<a href="#47" id="47" class="l"> 47: </a>            }<span class="php-keyword1">else</span> <span class="php-keyword1">if</span>(! <span class="php-keyword2">strcmp</span>(<span class="php-var">$name</span>, <span class="php-var">$memberFuncName</span>)){
<a href="#48" id="48" class="l"> 48: </a>                <span class="php-var">$bind</span> = <span class="php-keyword1">true</span>;   <span class="php-comment">//指定了方法名，且调用时的方法名和该指定方法名相同时，绑定回调函数</span>
<a href="#49" id="49" class="l"> 49: </a>            }
<a href="#50" id="50" class="l"> 50: </a>            <span class="php-keyword1">if</span>(<span class="php-var">$bind</span>) <span class="php-keyword2">call_user_func_array</span>(<span class="php-var">$callback</span>, <span class="php-var">$callback_args</span>);
<a href="#51" id="51" class="l"> 51: </a>                
<a href="#52" id="52" class="l"> 52: </a>            <span class="php-keyword2">call_user_func_array</span>(<span class="php-keyword1">array</span>(<span class="php-var">$obj</span>, <span class="php-var">$name</span>), <span class="php-var">$args</span>); <span class="php-comment">//正常执行所调用的成员方法</span>
<a href="#53" id="53" class="l"> 53: </a>                
<a href="#54" id="54" class="l"> 54: </a>        };
<a href="#55" id="55" class="l"> 55: </a>    }<span class="php-keyword1">catch</span> (DIException <span class="php-var">$e</span>){
<a href="#56" id="56" class="l"> 56: </a>        <span class="php-keyword1">throw</span> <span class="php-var">$e</span>;
<a href="#57" id="57" class="l"> 57: </a>    }
<a href="#58" id="58" class="l"> 58: </a>
<a href="#59" id="59" class="l"> 59: </a>    <span class="php-keyword1">return</span> <span class="php-num">0</span>;
<a href="#60" id="60" class="l"> 60: </a>}
<a href="#61" id="61" class="l"> 61: </a>
<a href="#62" id="62" class="l"> 62: </a>
<a href="#63" id="63" class="l"> 63: </a><span class="php-comment">/**
</span><a href="#64" id="64" class="l"> 64: </a><span class="php-comment"> * 向对象实例方法注入前置或后置代码，只针对某一端注入
</span><a href="#65" id="65" class="l"> 65: </a><span class="php-comment"> * @param DIBase $obj 对象句柄
</span><a href="#66" id="66" class="l"> 66: </a><span class="php-comment"> * @param string $memberFuncName 要注册的非static方法名
</span><a href="#67" id="67" class="l"> 67: </a><span class="php-comment"> * @param callable $callback 回调函数
</span><a href="#68" id="68" class="l"> 68: </a><span class="php-comment"> * @param array $callback_args 回调函数的参数
</span><a href="#69" id="69" class="l"> 69: </a><span class="php-comment"> * @param bool $isAfter 是否作为后置注入
</span><a href="#70" id="70" class="l"> 70: </a><span class="php-comment"> * @return int 状态码 (
</span><a href="#71" id="71" class="l"> 71: </a><span class="php-comment"> *      -1  -&gt; 不是对象句柄
</span><a href="#72" id="72" class="l"> 72: </a><span class="php-comment"> *      -2  -&gt; 不是回调函数
</span><a href="#73" id="73" class="l"> 73: </a><span class="php-comment"> *      -3  -&gt; 要注册的方法不存在
</span><a href="#74" id="74" class="l"> 74: </a><span class="php-comment"> *      -4  -&gt; 回调函数的参数表非数组形式
</span><a href="#75" id="75" class="l"> 75: </a><span class="php-comment"> * )
</span><a href="#76" id="76" class="l"> 76: </a><span class="php-comment"> */</span>
<a href="#77" id="77" class="l"> 77: </a><span class="php-keyword1">function</span> inject(DIBase <span class="php-var">$obj</span>, <span class="php-var">$memberFuncName</span>, <span class="php-var">$callback</span>, <span class="php-keyword1">array</span> <span class="php-var">$callback_args</span>=<span class="php-keyword1">array</span>(), <span class="php-var">$isAfter</span>=<span class="php-keyword1">false</span>){
<a href="#78" id="78" class="l"> 78: </a>
<a href="#79" id="79" class="l"> 79: </a>    <span class="php-keyword1">if</span>( !<span class="php-keyword2">is_object</span>(<span class="php-var">$obj</span>) ) <span class="php-keyword1">return</span> -<span class="php-num">1</span>;
<a href="#80" id="80" class="l"> 80: </a>    <span class="php-keyword1">if</span>( !<span class="php-keyword2">is_callable</span>(<span class="php-var">$callback</span>) ) <span class="php-keyword1">return</span> -<span class="php-num">2</span>;
<a href="#81" id="81" class="l"> 81: </a>    <span class="php-keyword1">if</span>( !<span class="php-var">$memberFuncName</span> &amp;&amp; !<span class="php-keyword2">method_exists</span>(<span class="php-var">$obj</span>, <span class="php-var">$memberFuncName</span>) ) <span class="php-keyword1">return</span> -<span class="php-num">3</span>;
<a href="#82" id="82" class="l"> 82: </a>    <span class="php-keyword1">if</span>( !<span class="php-keyword2">is_array</span>(<span class="php-var">$callback_args</span>) ) <span class="php-keyword1">return</span> -<span class="php-num">4</span>;
<a href="#83" id="83" class="l"> 83: </a>
<a href="#84" id="84" class="l"> 84: </a>    <span class="php-comment">//生成继承类，注入自定义代码，保持原有的参数传入和功能代码段</span>
<a href="#85" id="85" class="l"> 85: </a>    <span class="php-var">$clazz</span> = <span class="php-keyword2">get_class</span>(<span class="php-var">$obj</span>);
<a href="#86" id="86" class="l"> 86: </a>    <span class="php-var">$rc</span> = <span class="php-keyword1">new</span> ReflectionClass(<span class="php-var">$clazz</span>);
<a href="#87" id="87" class="l"> 87: </a>    <span class="php-var">$num</span> = <span class="php-var">$rc</span>-&gt;getMethod(<span class="php-var">$memberFuncName</span>)-&gt;getNumberOfParameters();
<a href="#88" id="88" class="l"> 88: </a>
<a href="#89" id="89" class="l"> 89: </a>    <span class="php-var">$vars</span> = <span class="php-keyword1">array</span>(
<a href="#90" id="90" class="l"> 90: </a>        <span class="php-quote">'var $callback;'</span>,
<a href="#91" id="91" class="l"> 91: </a>        <span class="php-quote">'var $callback_args;'</span>,
<a href="#92" id="92" class="l"> 92: </a>    );
<a href="#93" id="93" class="l"> 93: </a>
<a href="#94" id="94" class="l"> 94: </a>    <span class="php-var">$params</span> = params_to_str(<span class="php-var">$num</span>);
<a href="#95" id="95" class="l"> 95: </a>    <span class="php-var">$funcs</span> = <span class="php-keyword1">array</span>(
<a href="#96" id="96" class="l"> 96: </a>        <span class="php-quote">&quot;function </span><span class="php-var">$memberFuncName</span><span class="php-quote"> ( </span><span class="php-var">$params</span><span class="php-quote"> ){
</span><a href="#97" id="97" class="l"> 97: </a><span class="php-quote">        \</span><span class="php-var">$args</span><span class="php-quote"> = func_get_args();
</span><a href="#98" id="98" class="l"> 98: </a><span class="php-quote">        &quot;</span>.( <span class="php-var">$isAfter</span> ? <span class="php-quote">''</span> : <span class="php-quote">&quot;call_user_func_array(\</span><span class="php-var">$this</span><span class="php-quote">-&gt;callback, \</span><span class="php-var">$this</span><span class="php-quote">-&gt;callback_args);&quot;</span> ).<span class="php-quote">&quot;
</span><a href="#99" id="99" class="l"> 99: </a><span class="php-quote">        //call_user_func_array(array('</span><span class="php-var">$clazz</span><span class="php-quote">', '</span><span class="php-var">$memberFuncName</span><span class="php-quote">'),\</span><span class="php-var">$args</span><span class="php-quote">);//方式1
</span><a href="#100" id="100" class="l">100: </a><span class="php-quote">        //parent::</span><span class="php-var">{$memberFuncName}</span><span class="php-quote">( </span><span class="php-var">$params</span><span class="php-quote"> );//方式2
</span><a href="#101" id="101" class="l">101: </a><span class="php-quote">        call_user_func_array('parent::</span><span class="php-var">{$memberFuncName}</span><span class="php-quote">', \</span><span class="php-var">$args</span><span class="php-quote">);//方式3
</span><a href="#102" id="102" class="l">102: </a><span class="php-quote">        &quot;</span>.( ! <span class="php-var">$isAfter</span> ? <span class="php-quote">''</span> : <span class="php-quote">&quot;call_user_func_array(\</span><span class="php-var">$this</span><span class="php-quote">-&gt;callback, \</span><span class="php-var">$this</span><span class="php-quote">-&gt;callback_args);&quot;</span> ).<span class="php-quote">&quot;
</span><a href="#103" id="103" class="l">103: </a><span class="php-quote">        }&quot;</span>,
<a href="#104" id="104" class="l">104: </a>        <span class="php-quote">'function __construct(){
</span><a href="#105" id="105" class="l">105: </a><span class="php-quote">            $args = func_get_args();
</span><a href="#106" id="106" class="l">106: </a><span class="php-quote">            $last=$args[count($args)-1];
</span><a href="#107" id="107" class="l">107: </a><span class="php-quote">            $this-&gt;callback = $last[0];
</span><a href="#108" id="108" class="l">108: </a><span class="php-quote">            $this-&gt;callback_args = $last[1];
</span><a href="#109" id="109" class="l">109: </a><span class="php-quote">            call_user_func_array(&quot;parent::__construct&quot;, $args);
</span><a href="#110" id="110" class="l">110: </a><span class="php-quote">        }'</span>
<a href="#111" id="111" class="l">111: </a>    );
<a href="#112" id="112" class="l">112: </a>
<a href="#113" id="113" class="l">113: </a>    <span class="php-var">$tmpObj</span> = create_class(<span class="php-quote">&quot;tmp</span><span class="php-var">{$clazz}</span><span class="php-quote">&quot;</span>, <span class="php-keyword1">false</span>, <span class="php-var">$clazz</span>, <span class="php-keyword1">null</span>, <span class="php-var">$vars</span>, <span class="php-var">$funcs</span>)-&gt;newInstance(<span class="php-keyword1">array</span>(<span class="php-keyword1">array</span>(<span class="php-var">$callback</span>, <span class="php-var">$callback_args</span>)));
<a href="#114" id="114" class="l">114: </a>    <span class="php-keyword1">return</span> <span class="php-var">$tmpObj</span>;
<a href="#115" id="115" class="l">115: </a>    }
<a href="#116" id="116" class="l">116: </a>
<a href="#117" id="117" class="l">117: </a><span class="php-comment">/**
</span><a href="#118" id="118" class="l">118: </a><span class="php-comment">* 向对象实例方法注入前置或后置代码，可以同时对前后注入
</span><a href="#119" id="119" class="l">119: </a><span class="php-comment">* @param DIBase $obj 对象句柄
</span><a href="#120" id="120" class="l">120: </a><span class="php-comment">* @param string $memberFuncName 要注册的非static方法名
</span><a href="#121" id="121" class="l">121: </a><span class="php-comment">* @param array $before 前置增强array(callable, param_arr)
</span><a href="#122" id="122" class="l">122: </a><span class="php-comment">* @param array $after 后置增强array(callable, param_arr)
</span><a href="#123" id="123" class="l">123: </a><span class="php-comment">* @return int 状态码 (
</span><a href="#124" id="124" class="l">124: </a><span class="php-comment">*       -1  -&gt; 不是对象句柄
</span><a href="#125" id="125" class="l">125: </a><span class="php-comment">*       -2  -&gt; 没有检测到回调参数（$before和$after两者必有其一是array(callable, param_arr)形式，否则报该错误）
</span><a href="#126" id="126" class="l">126: </a><span class="php-comment">*       -3  -&gt; 要注册的方法不存在
</span><a href="#127" id="127" class="l">127: </a><span class="php-comment">*       -4  -&gt; 检测到回调函数的参数非数组形式
</span><a href="#128" id="128" class="l">128: </a><span class="php-comment">* )
</span><a href="#129" id="129" class="l">129: </a><span class="php-comment">*/</span>
<a href="#130" id="130" class="l">130: </a><span class="php-keyword1">function</span> inject_full(DIBase <span class="php-var">$obj</span>, <span class="php-var">$memberFuncName</span>, <span class="php-keyword1">array</span> <span class="php-var">$before</span>=<span class="php-keyword1">array</span>(), <span class="php-keyword1">array</span> <span class="php-var">$after</span>=<span class="php-keyword1">array</span>()){
<a href="#131" id="131" class="l">131: </a>
<a href="#132" id="132" class="l">132: </a>    <span class="php-var">$before</span> = <span class="php-keyword1">empty</span>(<span class="php-var">$before</span>)||<span class="php-num">2</span>!=<span class="php-keyword2">count</span>(<span class="php-var">$before</span>) ? <span class="php-keyword1">array</span>(<span class="php-keyword1">function</span>(){},<span class="php-keyword1">array</span>()) : <span class="php-var">$before</span>;
<a href="#133" id="133" class="l">133: </a>    <span class="php-var">$after</span> = <span class="php-keyword1">empty</span>(<span class="php-var">$after</span>)||<span class="php-num">2</span>!=<span class="php-keyword2">count</span>(<span class="php-var">$after</span>) ? <span class="php-keyword1">array</span>(<span class="php-keyword1">function</span>(){},<span class="php-keyword1">array</span>()) : <span class="php-var">$after</span>;
<a href="#134" id="134" class="l">134: </a>
<a href="#135" id="135" class="l">135: </a>    <span class="php-keyword1">if</span>( !<span class="php-keyword2">is_object</span>(<span class="php-var">$obj</span>) ) <span class="php-keyword1">return</span> -<span class="php-num">1</span>;
<a href="#136" id="136" class="l">136: </a>    <span class="php-keyword1">if</span>( ! ( <span class="php-num">2</span>==<span class="php-keyword2">count</span>(<span class="php-var">$before</span>) &amp;&amp; <span class="php-keyword2">is_callable</span>(<span class="php-var">$before</span>[<span class="php-num">0</span>]) || <span class="php-num">2</span>==<span class="php-keyword2">count</span>(<span class="php-var">$after</span>) &amp;&amp; <span class="php-keyword2">is_callable</span>(<span class="php-var">$after</span>[<span class="php-num">0</span>]) ) ) <span class="php-keyword1">return</span> -<span class="php-num">2</span>;
<a href="#137" id="137" class="l">137: </a>    <span class="php-keyword1">if</span>( !<span class="php-var">$memberFuncName</span> &amp;&amp; !<span class="php-keyword2">method_exists</span>(<span class="php-var">$obj</span>, <span class="php-var">$memberFuncName</span>) ) <span class="php-keyword1">return</span> -<span class="php-num">3</span>;
<a href="#138" id="138" class="l">138: </a>    <span class="php-keyword1">if</span>( ! ( <span class="php-num">2</span>==<span class="php-keyword2">count</span>(<span class="php-var">$before</span>) &amp;&amp; <span class="php-keyword2">is_array</span>(<span class="php-var">$before</span>[<span class="php-num">1</span>]) || <span class="php-num">2</span>==<span class="php-keyword2">count</span>(<span class="php-var">$after</span>) &amp;&amp; <span class="php-keyword2">is_array</span>(<span class="php-var">$after</span>[<span class="php-num">1</span>]) ) ) <span class="php-keyword1">return</span> -<span class="php-num">4</span>;
<a href="#139" id="139" class="l">139: </a>
<a href="#140" id="140" class="l">140: </a>
<a href="#141" id="141" class="l">141: </a>    <span class="php-comment">//生成继承类，注入自定义代码，保持原有的参数传入和功能代码段</span>
<a href="#142" id="142" class="l">142: </a>    <span class="php-var">$clazz</span> = <span class="php-keyword2">get_class</span>(<span class="php-var">$obj</span>);
<a href="#143" id="143" class="l">143: </a>    <span class="php-var">$rc</span> = <span class="php-keyword1">new</span> ReflectionClass(<span class="php-var">$clazz</span>);
<a href="#144" id="144" class="l">144: </a>    <span class="php-var">$num</span> = <span class="php-var">$rc</span>-&gt;getMethod(<span class="php-var">$memberFuncName</span>)-&gt;getNumberOfParameters();
<a href="#145" id="145" class="l">145: </a>
<a href="#146" id="146" class="l">146: </a>    <span class="php-var">$vars</span> = <span class="php-keyword1">array</span>(
<a href="#147" id="147" class="l">147: </a>        <span class="php-quote">'var $bf_callback;'</span>,
<a href="#148" id="148" class="l">148: </a>        <span class="php-quote">'var $bf_callback_args;'</span>,
<a href="#149" id="149" class="l">149: </a>        <span class="php-quote">'var $af_callback;'</span>,
<a href="#150" id="150" class="l">150: </a>        <span class="php-quote">'var $af_callback_args;'</span>,
<a href="#151" id="151" class="l">151: </a>    );
<a href="#152" id="152" class="l">152: </a>
<a href="#153" id="153" class="l">153: </a>    <span class="php-var">$params</span> = params_to_str(<span class="php-var">$num</span>);
<a href="#154" id="154" class="l">154: </a>    <span class="php-var">$funcs</span> = <span class="php-keyword1">array</span>(
<a href="#155" id="155" class="l">155: </a>        <span class="php-quote">&quot;function </span><span class="php-var">$memberFuncName</span><span class="php-quote"> ( </span><span class="php-var">$params</span><span class="php-quote"> ){
</span><a href="#156" id="156" class="l">156: </a><span class="php-quote">            \</span><span class="php-var">$args</span><span class="php-quote"> = func_get_args();
</span><a href="#157" id="157" class="l">157: </a><span class="php-quote">            call_user_func_array(\</span><span class="php-var">$this</span><span class="php-quote">-&gt;bf_callback, \</span><span class="php-var">$this</span><span class="php-quote">-&gt;bf_callback_args);
</span><a href="#158" id="158" class="l">158: </a><span class="php-quote">            //call_user_func_array(array('</span><span class="php-var">$clazz</span><span class="php-quote">', '</span><span class="php-var">$memberFuncName</span><span class="php-quote">'),\</span><span class="php-var">$args</span><span class="php-quote">);//方式1
</span><a href="#159" id="159" class="l">159: </a><span class="php-quote">            //parent::</span><span class="php-var">{$memberFuncName}</span><span class="php-quote">( </span><span class="php-var">$params</span><span class="php-quote"> );//方式2
</span><a href="#160" id="160" class="l">160: </a><span class="php-quote">            call_user_func_array('parent::</span><span class="php-var">{$memberFuncName}</span><span class="php-quote">', \</span><span class="php-var">$args</span><span class="php-quote">);//方式3
</span><a href="#161" id="161" class="l">161: </a><span class="php-quote">            call_user_func_array(\</span><span class="php-var">$this</span><span class="php-quote">-&gt;af_callback, \</span><span class="php-var">$this</span><span class="php-quote">-&gt;af_callback_args);
</span><a href="#162" id="162" class="l">162: </a><span class="php-quote">        }&quot;</span>,
<a href="#163" id="163" class="l">163: </a>        <span class="php-quote">'function __construct(){
</span><a href="#164" id="164" class="l">164: </a><span class="php-quote">            $args = func_get_args();
</span><a href="#165" id="165" class="l">165: </a><span class="php-quote">            $last1 = $args[count($args)-2];
</span><a href="#166" id="166" class="l">166: </a><span class="php-quote">            $this-&gt;bf_callback = $last1[0];
</span><a href="#167" id="167" class="l">167: </a><span class="php-quote">            $this-&gt;bf_callback_args = $last1[1];
</span><a href="#168" id="168" class="l">168: </a><span class="php-quote">            $last2 = $args[count($args)-1];
</span><a href="#169" id="169" class="l">169: </a><span class="php-quote">            $this-&gt;af_callback = $last2[0];
</span><a href="#170" id="170" class="l">170: </a><span class="php-quote">            $this-&gt;af_callback_args = $last2[1];
</span><a href="#171" id="171" class="l">171: </a><span class="php-quote">            call_user_func_array(&quot;parent::__construct&quot;, $args);
</span><a href="#172" id="172" class="l">172: </a><span class="php-quote">        }'</span>
<a href="#173" id="173" class="l">173: </a>    );
<a href="#174" id="174" class="l">174: </a>
<a href="#175" id="175" class="l">175: </a>    <span class="php-var">$tmpObj</span> = create_class(<span class="php-quote">&quot;tmp</span><span class="php-var">{$clazz}</span><span class="php-quote">&quot;</span>, <span class="php-keyword1">false</span>, <span class="php-var">$clazz</span>, <span class="php-keyword1">null</span>, <span class="php-var">$vars</span>, <span class="php-var">$funcs</span>)-&gt;newInstance(<span class="php-keyword1">array</span>( <span class="php-var">$before</span>, <span class="php-var">$after</span> ));
<a href="#176" id="176" class="l">176: </a>    <span class="php-keyword1">return</span> <span class="php-var">$tmpObj</span>;
<a href="#177" id="177" class="l">177: </a>}
<a href="#178" id="178" class="l">178: </a>
<a href="#179" id="179" class="l">179: </a>
<a href="#180" id="180" class="l">180: </a><span class="php-comment">/**
</span><a href="#181" id="181" class="l">181: </a><span class="php-comment"> * 实现动态注入或批量注入
</span><a href="#182" id="182" class="l">182: </a><span class="php-comment"> * 注：需求尚未明确
</span><a href="#183" id="183" class="l">183: </a><span class="php-comment"> */</span>
<a href="#184" id="184" class="l">184: </a><span class="php-keyword1">function</span> inject_dymic(){
<a href="#185" id="185" class="l">185: </a>
<a href="#186" id="186" class="l">186: </a>}
<a href="#187" id="187" class="l">187: </a>
<a href="#188" id="188" class="l">188: </a><span class="php-comment">/**
</span><a href="#189" id="189" class="l">189: </a><span class="php-comment"> * 向游离的函数注入代码
</span><a href="#190" id="190" class="l">190: </a><span class="php-comment"> * 注：技术可行性较低
</span><a href="#191" id="191" class="l">191: </a><span class="php-comment"> */</span>
<a href="#192" id="192" class="l">192: </a><span class="php-keyword1">function</span> inject_func(<span class="php-var">$func</span>, <span class="php-var">$callback</span>, <span class="php-var">$callback_args</span>=<span class="php-keyword1">array</span>(), <span class="php-var">$isAfter</span>=<span class="php-keyword1">false</span>){
<a href="#193" id="193" class="l">193: </a>    
<a href="#194" id="194" class="l">194: </a>}
<a href="#195" id="195" class="l">195: </a>
<a href="#196" id="196" class="l">196: </a>
<a href="#197" id="197" class="l">197: </a></code></pre>

	<div id="footer">
		 API documentation generated by <a href="http://apigen.org">ApiGen 2.6.0</a>
	</div>
</div>
</div>
</body>
</html>
